#ifndef CM_CONSTANT_H_
#define CM_CONSTANT_H_

#define LEN_MAX_FILE_NAME 1024

#include <stddef.h>

union cm_basedata {
	char c;
	unsigned char uc;
	short s;
	unsigned short us;
	int i;
	unsigned int ui;
	float f;
	double d;
};

/* name 'offsetof' is defined by glibc, so we define cmoffsetof */
#define cmoffsetof(type, member)  (size_t)(&(((type*)0)->member))

/*
 * 引入__mptr是为了作编译期间的类型检查，确保传入的ptr是指向struct member的指针。
 * 而在运行期间，这个赋值gcc可以优化掉，不会影响效率。 typeof是gcc的扩展特性
 */
#define container_of(ptr, type, member) ({          \
		const typeof(((type *)0)->member)*__mptr = (ptr);    \
		(type *)((char *)__mptr - cmoffsetof(type, member)); })

/*
 * @brief	序列化以及反序列化的函数原型
 * @param	origin： 原始数据，在该函数的实例中应该知道该数据的类型
 * 		result：(反)序列化后数据的首地址，存储空间在外部创建
 * 		retsize：传入result处的空间大小， 返回(反)序列化后数据的长度
 * @return	0表示成功，非0表示失败
 */
typedef int (*cm_serialize)(void *origin, char *result, size_t *retsize);

typedef cm_serialize cm_unserialize;

/*
 * @brief	比较函数的原型
 * @param	left和right分别是参与比较的两个数据
 * @return	大于、小于、等于0的值分表表示left比right大、小、相等
 */
typedef int (*cm_compare)(void *left, void *right);

/*
 * @brief	满足条件函数原型
 * @param	需要进行判断的东西
 * @return	0表示不满足， 非0表示满足
 */
typedef int (*cm_satisfy)(void *obj);

#endif /* CM_CONSTANT_H_ */
